<template>
	<view class="content">
		<!-- 点击按钮，调用writeData方法 -->
		<button @click="writeData">写入</button>
		<!-- 点击按钮，调用readData方法 -->
		<button @click="readData">读取</button>
		<br />
		<!-- 显示读取的内容 -->
		读取的内容:
		<br />
		<text id="content">{{ readContent }}</text>
	</view>
</template>

<script>
export default {
	data() {
		return {
			// 写入内容
			writeContent: "",
			// 读取内容
			readContent: "",
			// 等待状态
			waiting: null,
			// 是否准备好写入数据
			readyWriteData: false,
			// 是否准备好读取
			readyRead: false,
			// Nfc适配器
			NfcAdapter: null,
			// Ndef记录
			NdefRecord: null,
			// Ndef消息
			NdefMessage: null,
		}
	},
	onLoad() {
		// 关闭等待框
		plus.nativeUI.closeWaiting();
		// 监听NFC状态
		plus.globalEvent.addEventListener('plusready', this.listenNFCStatus(), false);
	},
	onUnload() {
		// 关闭等待框
		plus.nativeUI.closeWaiting();
	},
	methods: {
		// 写入数据
		writeData() {
			// 定义_this变量，指向当前实例
			let _this = this;
			// 弹出提示框，输入要写入的内容
			plus.nativeUI.prompt("写入的内容: ", function (e) {
				// 如果点击了确定按钮
				if (e.index == 0) {
					// 将输入的内容赋值给writeContent
					_this.writeContent = e.value;
				}
				// 如果writeContent为空
				if (!_this.writeContent) {
					// 弹出提示框，提示写入的内容不能为空
					_this.showToast('写入的内容不能为空！');
					// 返回
					return;
				}
				// 将readyWriteData设置为true
				_this.readyWriteData = true;
				// 弹出等待框，提示将NFC标签靠近
				_this.waiting = plus.nativeUI.showWaiting("请将NFC标签靠近！");
			}, "", "请输入要写入的内容", ["确定", "取消"]);


		},
		readData() {
			this.readyRead = true;
			this.waiting = plus.nativeUI.showWaiting("请将NFC标签靠近！");
		},
		listenNFCStatus() {
			// 定义_this变量，指向当前实例
			let _this = this;
			try {
				// 获取主活动
				let main = plus.android.runtimeMainActivity();
				// 导入Intent类
				let Intent = plus.android.importClass('android.content.Intent');
				// 导入Activity类
				let Activity = plus.android.importClass('android.app.Activity');
				// 导入PendingIntent类
				let PendingIntent = plus.android.importClass('android.app.PendingIntent');
				// 导入IntentFilter类
				let IntentFilter = plus.android.importClass('android.content.IntentFilter');
				// 导入NfcAdapter类
				this.NfcAdapter = plus.android.importClass('android.nfc.NfcAdapter');
				// 获取默认的NfcAdapter
				let nfcAdapter = this.NfcAdapter.getDefaultAdapter(main);
				// 创建Intent
				let intent = new Intent(main, main.getClass());
				// 设置Intent标志
				intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
				// 创建PendingIntent
				let pendingIntent = PendingIntent.getActivity(main, 0, intent, 0);
				// 创建IntentFilter
				let ndef = new IntentFilter("android.nfc.action.TECH_DISCOVERED");
				// 添加数据类型
				ndef.addDataType("*/*");
				// 创建一个intentFiltersArray数组，并将ndef添加进去
				let intentFiltersArray = [ndef];
				// 创建一个techListsArray数组，并将各种NFC技术添加进去
				let techListsArray = [
					["android.nfc.tech.IsoDep"],
					["android.nfc.tech.NfcA"],
					["android.nfc.tech.NfcB"],
					["android.nfc.tech.NfcF"],
					["android.nfc.tech.Nfcf"],
					["android.nfc.tech.NfcV"],
					["android.nfc.tech.NdefFormatable"],
					["android.nfc.tech.MifareClassi"],
					["android.nfc.tech.MifareUltralight"]
				];
				// 监听新意图事件
				plus.globalEvent.addEventListener("newintent",
					function () {
						console.error('newintent');
						// 延迟1秒后处理NFC数据
						setTimeout(_this.handle_nfc_data1, 1000);
					}, false);
				// 监听暂停事件
				plus.globalEvent.addEventListener("pause", function (e) {
					if (nfcAdapter) {
						// 禁用前台调度
						nfcAdapter.disableForegroundDispatch(main);
						console.log('pause');
					}
				}, false);
				// 监听恢复事件
				plus.globalEvent.addEventListener("resume", function (e) {
					if (nfcAdapter) {
						console.log('resume');
						// 启用前台调度
						nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray,
							techListsArray);
					}
				}, false);
				// 启用前台调度
				nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);
			} catch (e) {
				console.error(e);
			}
		},
		// 处理NFC数据
		handle_nfc_data1() {
			// 导入android.nfc.NdefRecord类
			this.NdefRecord = plus.android.importClass("android.nfc.NdefRecord");
			// 导入android.nfc.NdefMessage类
			this.NdefMessage = plus.android.importClass("android.nfc.NdefMessage");
			// 获取主活动
			let main = plus.android.runtimeMainActivity();
			// 获取意图
			let intent = main.getIntent();
			// 打印意图的action类型
			console.log("action type:" + intent.getAction());
			// 如果意图的action类型为"android.nfc.action.TECH_DISCOVERED"
			if ("android.nfc.action.TECH_DISCOVERED" == intent.getAction()) {
				// 如果readyWriteData为true
				if (this.readyWriteData) {
					// 调用__write方法
					this.__write(intent);
					// 将readyWriteData设置为false
					this.readyWriteData = false;
					// 如果readyRead为true
				} else if (this.readyRead) {
					// 调用__read方法
					this.__read(intent);
					// 将readyRead设置为false
					this.readyRead = false;
				}
			}
		},
		__read(intent) {
			// 设置等待框标题
			this.waiting.setTitle('请勿移开标签\n正在读取数据...');
			// 导入Parcelable类
			let Parcelable = plus.android.importClass("android.os.Parcelable");
			// 获取NDEF_MESSAGES
			let rawmsgs = intent.getParcelableArrayExtra("android.nfc.extra.NDEF_MESSAGES");
			console.log('NDEF_MESSAGES', rawmsgs);
			// 如果存在NDEF_MESSAGES
			// 获取records
			if (rawmsgs) {
				let records = rawmsgs[0].getRecords();
				// 获取payload
				let result = records[0].getPayload();
				// 将payload转换为字符串
				let s = plus.android.newObject("java.lang.String", result);
				console.log("读取的内容", s);
				// 将读取的内容赋值给readContent
				this.readContent = s;
			}
			// 关闭等待框
			this.waiting.close();
		},
		__write(intent) {
			// 尝试写入数据
			try {
				// 设置等待提示框标题
				this.waiting.setTitle('请勿移开标签\n正在写入...');
				// 获取要写入的数据
				let text = this.writeContent;
				console.log("text=" + text);
				// 将数据转换为字节数组
				let textBytes = plus.android.invoke(text, "getBytes");
				// image/jpeg text/plain  
				// 创建NdefRecord对象
				let textRecord = new this.NdefRecord(this.NdefRecord.TNF_MIME_MEDIA,
					plus.android.invoke("text/plain", "getBytes"), plus.android.invoke("", "getBytes"), textBytes);
				// 创建NdefMessage对象
				let message = new this.NdefMessage([textRecord]);
				// 导入Ndef和NdefFormatable类
				let Ndef = plus.android.importClass('android.nfc.tech.Ndef');
				let NdefFormatable = plus.android.importClass('android.nfc.tech.NdefFormatable');
				// 获取tag对象
				let tag = intent.getParcelableExtra(this.NfcAdapter.EXTRA_TAG);
				// 获取Ndef对象
				let ndef = Ndef.get(tag);
				// 如果Ndef对象不为空
				if (ndef != null) {
					// 获取message的字节数组长度
					let size = message.toByteArray().length;
					console.log("size=" + size);
					// 连接Ndef对象
					ndef.connect();
					// 如果Ndef对象不可写
					if (!ndef.isWritable()) {
						// 显示提示信息
						this.showToast("tag不允许写入");
						// 关闭等待框
						this.waiting.close();
						// 返回
						return;
					}
					// 判断文件大小是否超出容量
					if (ndef.getMaxSize() < size) {
						// 如果超出容量，显示提示信息
						this.showToast("文件大小超出容量");
						// 关闭等待框
						this.waiting.close();
						// 返回
						return;
					}

					// 向ndef写入NdefMessage
					ndef.writeNdefMessage(message);
					// 关闭等待框
					this.waiting.close();
					// 显示写入数据成功的提示
					this.showToast("写入数据成功.");
					// 返回
					return;
				} else {
					// 获取NdefFormatable对象
					let format = NdefFormatable.get(tag);
					// 如果NdefFormatable对象不为空
					if (format != null) {
						try {
							// 连接NdefFormatable对象
							format.connect();
							// 格式化tag并且写入message
							format.format(message);
							this.showToast("格式化tag并且写入message");
							this.waiting.close();
							return;
						} catch (e) {
							// 格式化tag失败
							this.showToast("格式化tag失败.");
							this.waiting.close();
							return;
						}
					} else {
						// Tag不支持NDEF
						this.showToast("Tag不支持NDEF");
						this.waiting.close();
						return;
					}
				}
			} catch (e) {
				console.log("error=" + e);
				this.waiting.close();
				this.showToast('写入失败');
			}

		},
		// 显示提示框
		showToast(msg) {
			// 使用plus.nativeUI.toast方法显示提示框
			plus.nativeUI.toast(msg, {
				// 设置提示框垂直居中
				verticalAlign: "center"
			});
		}
	},
}
</script>

<style></style>